//---------------------------------------------------------------------------------
// Copyright (c) 2008 VoiceLynx Project
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
//     1. The origin of this software must not be misrepresented; you must not
//        claim that you wrote the original software. If you use this software
//        in a product, an acknowledgment in the product documentation would be
//        appreciated but is not required.
//
//     2. Altered source versions must be plainly marked as such, and must not be
//        misrepresented as being the original software.
//
//     3. This notice may not be removed or altered from any source
//        distribution.
//---------------------------------------------------------------------------------

//
// This file holds the abstraction layer that lets you easily hook push-to-talk keys,
// or some other method of controlling opening/closing outgoing voice
//
// An implementation using OIS push-to-talk is provided, as well as some controllers 
// that analyze voice volume or speex VAD (voice activity detection)
//

#ifndef __VLControl_h__
#define __VLControl_h__

#include "VLPrerequisites.h"

struct VLIController
{
  virtual ~VLIController() { }

  //! Return true if we should be transmitting voice data
  virtual bool shouldOpenVoice() = 0;

  //! Return true to OVERRIDE shouldOpenVoice - useful for muting
  virtual bool shouldCloseVoice() = 0;
};

typedef VLPtrList<VLIController> VLControllerList;

class VLCompositeController : public VLIController
{
public:
  void addChild(std::auto_ptr<VLIController> controller);

private:
  VLU32 countShouldOpenChildren();
  VLU32 countShouldCloseChildren();

  VLControllerList mChildren;
};



#endif